במדריך אני אלמד אתכם איך להשתמש בטפסים בעזרת הפריימוורק Yii של PHP.
לחצו כאן בכדי להגיע לחלק א' של המדריך; חלק ב'; חלק ג'; חלק ד'.
במדריך הקודם הבטחתי שאלמד אתכם לעשות התחברות וגם פרופילי משתמשים, אבל אנשים חשבו שלא לימדתי נכון, כי עשיתי טופס בדרך שונה מהדרך ש-Yii נותנת. לכן במדריך הזה אנו נעשה את טופס ההרשמה בדרך המקובלת ב-Yii.
שלא תבינו לא נכון; המדריך הקודם כן משמעותי והוא כן חשוב כי לימדתי איך להוסיף טור לטבלה וגם איך ליצור מודלים.
עכשיו, דבר ראשון ניצור את המודל של הטופס בתיקייה protected/models/RegisterForm.php, ושם ניצור מחלקה בשם RegisterForm שתירש מהמחלקה CFormModel.
<?php
class RegisterForm extends CFormModel
{
}
?>
class RegisterForm extends CFormModel
{
}
?>
לכל שדה צריך משתנה משלו. השדות יהיו: שם משתמש, סיסמה, אימות סיסמה, אימייל וקוד קאפצ'ה.
<?php
class RegisterForm extends CFormModel
{
public $username; // השדה של שם המשתמש
public $password; // השדה של הסיסמה
public $password2; // השדה של אימות הסיסמה
public $email; // השדה של הדואר האלקטרוני
public $verifyCode; // השדה של הקאפצ'ה
}
?>
class RegisterForm extends CFormModel
{
public $username; // השדה של שם המשתמש
public $password; // השדה של הסיסמה
public $password2; // השדה של אימות הסיסמה
public $email; // השדה של הדואר האלקטרוני
public $verifyCode; // השדה של הקאפצ'ה
}
?>
עכשיו בואו נציג את הטופס בדף.
נפתח את ה-action שמציג את ההרשמה, ושם ניצור משתנה שהוא ייקח מחלקה חדשה של הטופס. נקרא למשתנה model ונוסיף לאותו לרינדור.
זה הולך כך:
protected/controllers/AccountController.php
<?php
class AccountController extends CController
{
public $layout = 'header';
public function actionRegister()
{
$model = new RegisterForm();
$this->render('register',array('model'=>$model));
}
}
?>
class AccountController extends CController
{
public $layout = 'header';
public function actionRegister()
{
$model = new RegisterForm();
$this->render('register',array('model'=>$model));
}
}
?>
עכשיו בואו ניצור את הטופס.
נפתח את הטופס הקודם שעשינו (protected/views/account/register.php), נמחק את כל מה שיש שם ונכין אחד חדש.
דבר ראשון, בואו נשים כותרת קטנה ונפתח את הטופס.
protected/views/account/register.php
<h1>הירשם</h1>
<? $form = $this->beginWidget('CActiveForm'); ?>
<? $this->endWidget(); ?>
<? $form = $this->beginWidget('CActiveForm'); ?>
<? $this->endWidget(); ?>
איפה ה-<form>? עדין לא לימדתי אותכם על widget אז אני אלמד אתכם עכשיו.
אפשר להגדיר את ה-widget כמו רינדור ברינדור. (אין לי הגדרה יותר מתאימה לזה כעת...)
כשפתחנו את ה-widget אנחנו רינדרנו את ה-<form>, וכשסגרנו את ה-widget רינדרנו את ה-</form>.
את המשתנה $form יצרנו כדי שהוא יעזור לנו להציג את השדות.
עכשיו בואו נציג את השדות.
<h1>הירשם</h1>
<?php $form = $this->beginWidget('CActiveForm'); ?>
<table>
<tr>
<td><?php echo $form->labelEx($model, 'username'); ?></td>
<td><?php echo $form->textField($model, 'username'); ?></td> </tr>
<tr>
<td><?php echo $form->labelEx($model, 'password'); ?></td>
<td><?php echo $form->passwordField($model, 'password'); ?></td></tr>
<tr>
<td><?php echo $form->labelEx($model, 'password2'); ?></td>
<td><?php echo $form->passwordField($model, 'password2'); ?></td></tr>
<tr>
<td><?php echo $form->labelEx($model, 'email'); ?></td>
<td><?php echo $form->textField($model, 'email'); ?></td>
</tr>
</table>
<?php $this->endWidget(); ?>
<?php $form = $this->beginWidget('CActiveForm'); ?>
<table>
<tr>
<td><?php echo $form->labelEx($model, 'username'); ?></td>
<td><?php echo $form->textField($model, 'username'); ?></td> </tr>
<tr>
<td><?php echo $form->labelEx($model, 'password'); ?></td>
<td><?php echo $form->passwordField($model, 'password'); ?></td></tr>
<tr>
<td><?php echo $form->labelEx($model, 'password2'); ?></td>
<td><?php echo $form->passwordField($model, 'password2'); ?></td></tr>
<tr>
<td><?php echo $form->labelEx($model, 'email'); ?></td>
<td><?php echo $form->textField($model, 'email'); ?></td>
</tr>
</table>
<?php $this->endWidget(); ?>
אוקיי, כנראה אתם אומרים לעצמכם כמה דברים: מה הן הפונקציות האלו ולמה זה מציג את הטופס באנגלית באתר?
Yii מאפשרת להציג קוד HTML יותר בקלות ע"י פונקציות ב-PHP וגם כדי ש-Yii תזהה את השדות האלו.
עכשיו הסבר על הפונקציות.
textField( Class , String );
ב-Class אמורה להיות המחלקה של הטופס. (מה שהוספנו בקונטרולר לרינדור זה המשתנה שאמור להיות שם.)
ב-String אמור להיות השם של השדה. ומה אמרנו? כדי שיהיה שדה בטופס צריך ליצור משתנה של השדה, ואם נכניס ב-String שם של שדה שהוא לא משתנה במחלקה של הטופס, נקבל שגיאה.
ה-labelEx וה-passwordField גם מקבלים משתנים בצורה כזאת.
ה-labelEx מציג את השם של השדה. למה זה באנגלית, אתם שואלים? טוב, בהמשך אנחנו נשנה את זה לעברית.
עכשיו נוסיף את כפתור שליחת הטופס.
<h1>הירשם</h1>
<?php $form = $this->beginWidget('CActiveForm'); ?>
<table>
<tr>
<td><?php echo $form->labelEx($model, 'username'); ?></td>
<td><?php echo $form->textField($model, 'username'); ?></td> </tr>
<tr>
<td><?php echo $form->labelEx($model, 'password'); ?></td>
<td><?php echo $form->passwordField($model, 'password'); ?></td></tr>
<tr>
<td><?php echo $form->labelEx($model, 'password2'); ?></td>
<td><?php echo $form->passwordField($model, 'password2'); ?></td></tr>
<tr>
<td><?php echo $form->labelEx($model, 'email'); ?></td>
<td><?php echo $form->textField($model, 'email'); ?></td>
</tr>
</table>
<?php echo CHtml::submitButton('התחבר'); ?>
<?php $this->endWidget(); ?>
<?php $form = $this->beginWidget('CActiveForm'); ?>
<table>
<tr>
<td><?php echo $form->labelEx($model, 'username'); ?></td>
<td><?php echo $form->textField($model, 'username'); ?></td> </tr>
<tr>
<td><?php echo $form->labelEx($model, 'password'); ?></td>
<td><?php echo $form->passwordField($model, 'password'); ?></td></tr>
<tr>
<td><?php echo $form->labelEx($model, 'password2'); ?></td>
<td><?php echo $form->passwordField($model, 'password2'); ?></td></tr>
<tr>
<td><?php echo $form->labelEx($model, 'email'); ?></td>
<td><?php echo $form->textField($model, 'email'); ?></td>
</tr>
</table>
<?php echo CHtml::submitButton('התחבר'); ?>
<?php $this->endWidget(); ?>
הסבר קטן:
CHtml זו גם מחלקה שעוזרת בהצגת קודי HTML בעזרת PHP.
עכשיו אתם בטח רוצים לשאול למה לא השתמשנו במשתנה form או למה כשהצגנו את השדות לא השתמשנו ב-CHtml. התשובה היא כזאת: מכיוון שהמחלקה CHtml לא נותנת אפשרות למחלקה של הטופס לקלוט את ה-inputs (יש דרך שהיא כן מאפשרת, אבל לא השתמשתי בה.), נשתמש במשתנה form, ולמה אני לא משתמש ב-form להציג את הכפתור? כי כבר אמרתי שבשביל להציג input צריך ליצור משתנה שלו במחלקה של הטופס, ובשביל מה ליצור משתנה חדש?
עכשיו אפשר לראות שכאשר אנו שולחים את הטופס לא קורה כלום; הוא שולח את הטופס, אבל לא מציג שגיאה ולא מוסיף למסד.
לכן בואו נתחיל לעבוד.
דבר ראשון נבדוק אם שלחו את הטופס.
ב-action נכתוב תנאי, בעזרתו נבדוק אם ה-POST בשם RegisterForm קיים. למה בשם RegisterForm? בגלל שה-RegisterForm זה השם של המחלקה של הטופס.
protected/controllers/AccountController.php
<?php
class AccountController extends CController
{
public $layout = 'header';
public function actionRegister()
{
$model = new RegisterForm();
if(isset($_POST['RegisterForm']))
{
print 'Work!';
}
$this->render('register',array('model'=>$model));
}
}
?>
class AccountController extends CController
{
public $layout = 'header';
public function actionRegister()
{
$model = new RegisterForm();
if(isset($_POST['RegisterForm']))
{
print 'Work!';
}
$this->render('register',array('model'=>$model));
}
}
?>
כתבתי print 'Work!'; בשביל לראות אם שליחת הטופס עובדת.
תשלחו גם אתם את הטופס, ואם זה מציג Work זה אומר שעד עכשיו עשיתם טוב, ואם לא - חזרו על המדריך שוב.
עכשיו בואו נעשה שזה יציג Work רק אם אין שגיאות בטופס.
לכך יש את הפונקציה validate של המחלקה של הטופס והיא בודקת אם הטופס נשלח ואם אין שגיאות בטופס.
אבל לפני זה צריך להגדיר את ה-POST לטופס בעזרת המשתנה של המחלקה של הטופס בשם attributes. נגדיר לו את הטופס כך:
<?php
class AccountController extends CController
{
public $layout = 'header';
public function actionRegister()
{
$model = new RegisterForm();
if(isset($_POST['RegisterForm']))
{
$model->attributes = $_POST['RegisterForm'];
if($model->validate())
{
print 'Work!';
}
}
$this->render('register',array('model'=>$model));
}
}
?>
class AccountController extends CController
{
public $layout = 'header';
public function actionRegister()
{
$model = new RegisterForm();
if(isset($_POST['RegisterForm']))
{
$model->attributes = $_POST['RegisterForm'];
if($model->validate())
{
print 'Work!';
}
}
$this->render('register',array('model'=>$model));
}
}
?>
עכשיו יש לנו בעיה קטנה: בכל פעם שנשלח את הטופס לא נראה את השגיאות, כי אין חוקים לטופס.
אז קודם כל בואו נציג את השגיאות בדף.
<h1>הירשם</h1>
<?php $form = $this->beginWidget('CActiveForm'); ?>
[b]<?php echo $form->errorSummary($model); ?>[/b]
<table>
<tr>
<td><?php echo $form->labelEx($model, 'username'); ?></td>
<td><?php echo $form->textField($model, 'username'); ?></td> </tr>
<tr>
<td><?php echo $form->labelEx($model, 'password'); ?></td>
<td><?php echo $form->passwordField($model, 'password'); ?></td></tr>
<tr>
<td><?php echo $form->labelEx($model, 'password2'); ?></td>
<td><?php echo $form->passwordField($model, 'password2'); ?></td></tr>
<tr>
<td><?php echo $form->labelEx($model, 'email'); ?></td>
<td><?php echo $form->textField($model, 'email'); ?></td>
</tr>
</table>
<?php echo CHtml::submitButton('התחבר'); ?>
<?php $this->endWidget(); ?>
<?php $form = $this->beginWidget('CActiveForm'); ?>
[b]<?php echo $form->errorSummary($model); ?>[/b]
<table>
<tr>
<td><?php echo $form->labelEx($model, 'username'); ?></td>
<td><?php echo $form->textField($model, 'username'); ?></td> </tr>
<tr>
<td><?php echo $form->labelEx($model, 'password'); ?></td>
<td><?php echo $form->passwordField($model, 'password'); ?></td></tr>
<tr>
<td><?php echo $form->labelEx($model, 'password2'); ?></td>
<td><?php echo $form->passwordField($model, 'password2'); ?></td></tr>
<tr>
<td><?php echo $form->labelEx($model, 'email'); ?></td>
<td><?php echo $form->textField($model, 'email'); ?></td>
</tr>
</table>
<?php echo CHtml::submitButton('התחבר'); ?>
<?php $this->endWidget(); ?>
הופנקציה errorSummary מציגה את כל שגיאות שבטופס. אם יהיו עכשיו שגיאות - זה יציג אותם.
אבל עדיין אם נריץ את הטופס לא נראה שגיאות, כי לא יצרנו עדיין את החוקים.
לכן, נפתח את המודל של הטופס ושם ניצור פונקציה חדשה בשם rules שמחזירה מערך שהוא בעצם החוקים.
<?php
class RegisterForm extends CFormModel
{
public $username; // השדה של שם המשתמש
public $password; // השדה של הסיסמה
public $password2; // השדה של אימות הסיסמה
public $email; // השדה של הדואר האלקטרוני
public $verifyCode; // השדה של הקאפצ'ה
public function rules()
{
return array
(
);
}
}
?>
class RegisterForm extends CFormModel
{
public $username; // השדה של שם המשתמש
public $password; // השדה של הסיסמה
public $password2; // השדה של אימות הסיסמה
public $email; // השדה של הדואר האלקטרוני
public $verifyCode; // השדה של הקאפצ'ה
public function rules()
{
return array
(
);
}
}
?>
עכשיו עדיין לא הגדרנו חוקים, אלא רק יצרנו את הפונקציה. לכן, בואו נגדיר את החוקים.
אלו החוקים:
- שם המשתמש חייב להכיל 4-16 תווים.
- שם המשתמש מופיע רק פעם אחת במסד.
- הסיסמה חייבת להכיל לפחות 6 תווים.
- אימות הסיסמה חייב להיות שווה לסיסמה.
- האימייל חייב להופיע רק פעם אחת במסד.
- האימייל חייב להיות תקין.
- הקאפצ'ה חייבת להיות תקינה. (בהמשך נוסיף אותה.)
ואנחנו מממשים את זה כך:
protected/models/RegisterForm.php
<?php
class RegisterForm extends CFormModel
{
public $username; // השדה של שם המשתמש
public $password; // השדה של הסיסמה
public $password2; // השדה של אימות הסיסמה
public $email; // השדה של הדואר האלקטרוני
public $verifyCode; // השדה של הקאפצ'ה
private $_identity;
public function rules()
{
return array
(
array('username', 'length', 'allowEmpty' => false, 'min' => 4, 'max' => 16), // בודק את כמות התווים בשם המשתמש
array('username', 'unique', 'className' => 'Account'), // בודק אם שם המשתמש לא נמצא במסד
array('password', 'length', 'allowEmpty' => false, 'min' => 6), // בדיקת כמות התווים בסיסמה
array('password2', 'compare', 'compareAttribute' => 'password'), // בודקים אם אימות הסיסמה והסיסמה זהים
array('email', 'unique', 'className' => 'Account'), // בודק אם האימייל לא נמצא במסד
array('email', 'email', 'allowEmpty' => false, 'checkMX' => true) // בודק את התקינות של האימייל
);
}
}
?>
class RegisterForm extends CFormModel
{
public $username; // השדה של שם המשתמש
public $password; // השדה של הסיסמה
public $password2; // השדה של אימות הסיסמה
public $email; // השדה של הדואר האלקטרוני
public $verifyCode; // השדה של הקאפצ'ה
private $_identity;
public function rules()
{
return array
(
array('username', 'length', 'allowEmpty' => false, 'min' => 4, 'max' => 16), // בודק את כמות התווים בשם המשתמש
array('username', 'unique', 'className' => 'Account'), // בודק אם שם המשתמש לא נמצא במסד
array('password', 'length', 'allowEmpty' => false, 'min' => 6), // בדיקת כמות התווים בסיסמה
array('password2', 'compare', 'compareAttribute' => 'password'), // בודקים אם אימות הסיסמה והסיסמה זהים
array('email', 'unique', 'className' => 'Account'), // בודק אם האימייל לא נמצא במסד
array('email', 'email', 'allowEmpty' => false, 'checkMX' => true) // בודק את התקינות של האימייל
);
}
}
?>
כמו שניתן לראות, במערך שאנו מחזירים בפונקציה אנחנו יוצרים מערכים, זאת אומרת מערך בתוך מערך.
בכל מערך אנחנו מגדירים את התנאים, ובכל תנאי השדה הראשון הוא השם של השדה, כמו שניתן לראות.
הסבר בתווים: array(שם השדה, התנאי, הגדרות).
ועכשיו הסבר מפורט:
length
בודק את מספר התווים בשדה. ההגדרות שלו בהם השתמשנו הן min, max ו-allowEmpty. ה-min זו כמות התווים המינימלית של השדה, max זו כמות המקסמלית של התווים ו-allowEmpty זה האם לא לבדוק את השדה אם הערך בו ריק. לדוגמה, אם לא הכנסתי טקסט לשם המשתמש ולא עשיתי ש-allowEmpty יהיה שווה ל-false - הוא לא יבדוק את התנאי.
unique
בודק אם הערך נמצא בטבלה. לדוגמה, בשם משתמש הוא בדק אם שם המשתמש נמצא במסד בטבלה של ה-accounts. ההגדרה שלו היא className, שמקבלת את השם של המודל של הטבלה. בדקנו אם שם המשתמש נמצא בטבלה של ה-accounts ורשמנו את השם של המודל של הטבלה accounts, שלו קוראים Account.
compare
בודק אם שדה מסויים שווה לשדה אחר. במקרה הזה בדקנו אם השדה password2 שווה לשדה password. ההגדרה שלו היא compareAttribute, שמקבלת את השדה אליו הוא צריך להשוות.
בודק אם השדה הוא אימייל והוא תקין, ההגדרות שלו הן allowEmpty, שבודקת אם לבדוק אם השדה ריק, וגם checkMX, שבודקת אם הדומיין של האימייל קיים. לדוגמה, אם רשמתי [email protected] הוא יאשר את קיומו, כי walla קיים, אבל אם הייתי רושם [email protected] זה יכחיש את קיומו (שגיאה), מכיוון ש-walla2 לא קיים.
יש עוד הרבה תנאים שלא הראיתי. ניתן למצוא אותם כאן.
עכשיו בואו נטפל בעניין האנגלית. דבר ראשון נתקן את ה-labels.
בשבילו ניצור פונקציה חדשה בשם attributeLabels שהיא גם מחזירה מערך, ושם נגדיר כל שדה ופירושו בעברית.
<?php
class RegisterForm extends CFormModel
{
public $username; // השדה של שם המשתמש
public $password; // השדה של הסיסמה
public $password2; // השדה של אימות הסיסמה
public $email; // השדה של הדואר האלקטרוני
public $verifyCode; // השדה של הקאפצ'ה
private $_identity;
public function rules()
{
return array
(
array('username', 'length', 'allowEmpty' => false, 'min' => 4, 'max' => 16), // בודק את כמות התווים בשם המשתמש
array('username', 'unique', 'className' => 'Account'), // בודק אם שם המשתמש לא נמצא במסד
array('password', 'length', 'allowEmpty' => false, 'min' => 6), // בדיקת כמות התווים בסיסמה
array('password2', 'compare', 'compareAttribute' => 'password'), // בודקים אם אימות הסיסמה והסיסמה זהים
array('email', 'unique', 'className' => 'Account'), // בודק אם האימייל לא נמצא במסד
array('email', 'email', 'allowEmpty' => false, 'checkMX' => true) // בודק את התקינות של האימייל
);
}
public function attributeLabels()
{
return array
(
'username' => 'שם משתמש',
'password' => 'סיסמה',
'password2' => 'אימות סיסמה',
'email' => 'דואר אלקטרוני',
'verifyCode' => 'קוד אבטחה'
);
}
}
?>
class RegisterForm extends CFormModel
{
public $username; // השדה של שם המשתמש
public $password; // השדה של הסיסמה
public $password2; // השדה של אימות הסיסמה
public $email; // השדה של הדואר האלקטרוני
public $verifyCode; // השדה של הקאפצ'ה
private $_identity;
public function rules()
{
return array
(
array('username', 'length', 'allowEmpty' => false, 'min' => 4, 'max' => 16), // בודק את כמות התווים בשם המשתמש
array('username', 'unique', 'className' => 'Account'), // בודק אם שם המשתמש לא נמצא במסד
array('password', 'length', 'allowEmpty' => false, 'min' => 6), // בדיקת כמות התווים בסיסמה
array('password2', 'compare', 'compareAttribute' => 'password'), // בודקים אם אימות הסיסמה והסיסמה זהים
array('email', 'unique', 'className' => 'Account'), // בודק אם האימייל לא נמצא במסד
array('email', 'email', 'allowEmpty' => false, 'checkMX' => true) // בודק את התקינות של האימייל
);
}
public function attributeLabels()
{
return array
(
'username' => 'שם משתמש',
'password' => 'סיסמה',
'password2' => 'אימות סיסמה',
'email' => 'דואר אלקטרוני',
'verifyCode' => 'קוד אבטחה'
);
}
}
?>
אם תריצו עכשיו את האתר אתם תיראו שזה בעברית, אבל השגיאות עדיין באנגלית, אז בואו נתקן את זה.
את זה מגדירים בתנאים שברוב זה עוד הגדרה בשם message, רק שב-length זה מתחלק ל-tooLong (ארוך מדי) ול-tooShort (קצר מידי).
<?php
class RegisterForm extends CFormModel
{
public $username; // השדה של שם המשתמש
public $password; // השדה של הסיסמה
public $password2; // השדה של אימות הסיסמה
public $email; // השדה של הדואר האלקטרוני
public $verifyCode; // השדה של הקאפצ'ה
private $_identity;
public function rules()
{
return array
(
array('username', 'length', 'allowEmpty' => false, 'min' => 4, 'max' => 16, 'tooShort' => 'מספר התווים בשם המשתמש חייב להיות לפחות 4 תווים', 'tooLong' => 'בשם המשתמש חייבים להיות עד 16 תווים ולא יותר'), // בודק את כמות התווים בשם המשתמש
array('username', 'unique', 'className' => 'Account', 'message' => 'שם המשתמש נמצא במסד'), // בודק אם שם המשתמש לא נמצא במסד
array('password', 'length', 'allowEmpty' => false, 'min' => 6, 'tooShort' => 'מספר התווים בסיסמה חייב להיות לפחות 6'), // בדיקת כמות התווים בסיסמה
array('password2', 'compare', 'compareAttribute' => 'password', 'message' => 'אימות הסיסמה אינו זהה לסיסמה'), // בודקים אם אימות הסיסמה והסיסמה זהים
array('email', 'unique', 'className' => 'Account', 'message' => 'הדואר האלקטרוני נמצא במסד'), // בודק אם האימייל לא נמצא במסד
array('email', 'email', 'allowEmpty' => false, 'checkMX' => true, 'message' => 'הדואר האלקטרוני אינו תקין') // בודק את התקינות של האימייל
);
}
public function attributeLabels()
{
return array
(
'username' => 'שם משתמש',
'password' => 'סיסמה',
'password2' => 'אימות סיסמה',
'email' => 'דואר אלקטרוני',
'verifyCode' => 'קוד אבטחה'
);
}
}
?>
class RegisterForm extends CFormModel
{
public $username; // השדה של שם המשתמש
public $password; // השדה של הסיסמה
public $password2; // השדה של אימות הסיסמה
public $email; // השדה של הדואר האלקטרוני
public $verifyCode; // השדה של הקאפצ'ה
private $_identity;
public function rules()
{
return array
(
array('username', 'length', 'allowEmpty' => false, 'min' => 4, 'max' => 16, 'tooShort' => 'מספר התווים בשם המשתמש חייב להיות לפחות 4 תווים', 'tooLong' => 'בשם המשתמש חייבים להיות עד 16 תווים ולא יותר'), // בודק את כמות התווים בשם המשתמש
array('username', 'unique', 'className' => 'Account', 'message' => 'שם המשתמש נמצא במסד'), // בודק אם שם המשתמש לא נמצא במסד
array('password', 'length', 'allowEmpty' => false, 'min' => 6, 'tooShort' => 'מספר התווים בסיסמה חייב להיות לפחות 6'), // בדיקת כמות התווים בסיסמה
array('password2', 'compare', 'compareAttribute' => 'password', 'message' => 'אימות הסיסמה אינו זהה לסיסמה'), // בודקים אם אימות הסיסמה והסיסמה זהים
array('email', 'unique', 'className' => 'Account', 'message' => 'הדואר האלקטרוני נמצא במסד'), // בודק אם האימייל לא נמצא במסד
array('email', 'email', 'allowEmpty' => false, 'checkMX' => true, 'message' => 'הדואר האלקטרוני אינו תקין') // בודק את התקינות של האימייל
);
}
public function attributeLabels()
{
return array
(
'username' => 'שם משתמש',
'password' => 'סיסמה',
'password2' => 'אימות סיסמה',
'email' => 'דואר אלקטרוני',
'verifyCode' => 'קוד אבטחה'
);
}
}
?>
אם אתם רוצים להראות שגיאה רק של שדה מסויים זה לא בעיה. זה הולך כך:
<h1>הירשם</h1>
<?php $form = $this->beginWidget('CActiveForm'); ?>
<table>
<tr>
<td><?php echo $form->labelEx($model, 'username'); ?></td>
<td><?php echo $form->textField($model, 'username'); ?></td>
<td><span style="color:#ff0000"><?php echo $form->error($model, 'username'); ?></span></td>
</tr>
<tr>
<td><?php echo $form->labelEx($model, 'password'); ?></td>
<td><?php echo $form->passwordField($model, 'password'); ?></td>
<td><span style="color:#ff0000"><?php echo $form->error($model, 'password'); ?></span></td>
<tr>
<td><?php echo $form->labelEx($model, 'password2'); ?></td>
<td><?php echo $form->passwordField($model, 'password2'); ?></td>
<td><span style="color:#ff0000"><?php echo $form->error($model, 'password2'); ?></span></td>
<tr>
<td><?php echo $form->labelEx($model, 'email'); ?></td>
<td><?php echo $form->textField($model, 'email'); ?></td>
<td><span style="color:#ff0000"><?php echo $form->error($model, 'email'); ?></span></td>
</tr>
</table>
<?php echo CHtml::submitButton('התחבר'); ?>
<?php $this->endWidget(); ?>
<?php $form = $this->beginWidget('CActiveForm'); ?>
<table>
<tr>
<td><?php echo $form->labelEx($model, 'username'); ?></td>
<td><?php echo $form->textField($model, 'username'); ?></td>
<td><span style="color:#ff0000"><?php echo $form->error($model, 'username'); ?></span></td>
</tr>
<tr>
<td><?php echo $form->labelEx($model, 'password'); ?></td>
<td><?php echo $form->passwordField($model, 'password'); ?></td>
<td><span style="color:#ff0000"><?php echo $form->error($model, 'password'); ?></span></td>
<tr>
<td><?php echo $form->labelEx($model, 'password2'); ?></td>
<td><?php echo $form->passwordField($model, 'password2'); ?></td>
<td><span style="color:#ff0000"><?php echo $form->error($model, 'password2'); ?></span></td>
<tr>
<td><?php echo $form->labelEx($model, 'email'); ?></td>
<td><?php echo $form->textField($model, 'email'); ?></td>
<td><span style="color:#ff0000"><?php echo $form->error($model, 'email'); ?></span></td>
</tr>
</table>
<?php echo CHtml::submitButton('התחבר'); ?>
<?php $this->endWidget(); ?>
מחקתי את ה-errorSummary ופשוט הצגתי כל שגיאה ליד השדה שלה.
הפונקציה error מקבלת ערכים כמו ב-textField.
ה-captcha תהיה בחלק ו', בגלל ש-phpguide מגביל אותי בכמות התווים במדריך. P:
תגובות לכתבה:
כל הכבוד.. אבל סתם טיפ..
לפני הצגת השגיאות, הייתי מעדיף לעשות בדיקה האם קיים בכלל שגיאות, ואם אכן קיים, אז ליצור את ה-DIV שאמור לסכם הכל.
בקשר לעברית, זה קצת מוזר להתחיל לכתוב msg לכל שדה, אז אני חושב שכדי כבר לשנות את השפה הראשית של האפליקציה, ואז אתה מקבל את השפה שנמצאת בתיקית he תחת MESSEGES.
יש ב yii כמה סוגי וולדיטורים שאליהו תיאר למעלה.
אפשר להוסיף קישור לרשימת כל הוולדיטורים וכל הפרמטרים האפשריים שהם מקבלים
yii validators cheat sheet
http://yii.googlecode.com/files/yii-1.1.0-validator-cheatsheet.pdf
כמעט לכל וולידטור אפשר לתת פרמטר של message
עם הודעת שגיאה שתוצג במקרה והוזן תוכן שלא עובר וולידציה.
אפשר, אבל בשביל לקבל רק עברית.. עם התרגום הברירת מחדל, זה פשוט לשנות את שפת האפליקציה וסאלמת..
תודה על התגובות :) אבל אני צריך לדעת אם המדריך הזה עזר למישהו
אני משתמש 120753 פשוט לא הייתי מחובר
תודה ענקיית אליהו! כל כך חיכיתי להמשך המדריכים :)!
אליהו, תמשיך לכתוב.. רואים שאתה יודע מה שאתה עושה בקוד ולא סתם עובד כמו רובוט. תמשיך ככה.
תודה רבה אליהו! אתה ממש עוזר עם המדריכים האלה!
תמשיך כך (;
אני כבר מחכה למדריך הבא
תודות!
אחלה מדריך ^^
מחכה להבא!